import axios from 'axios';
import * as config from './config';
import cache from './cache';
import navigation from './navigation';

// axios 配置
axios.defaults.timeout = config.TIMEOUT;
axios.defaults.baseURL = config.BASEURL;

// http request 拦截器（所有发送的请求都要从这儿过一次），通过这个，我们就可以把token传到后台，我这里是使用sessionStorage来存储token等权限信息和用户信息，若要使用cookie可以自己封装一个函数并import便可使用
axios.interceptors.request.use(async (configs) => {

  configs.data = JSON.stringify(configs.data);
  configs.headers = {
    'Content-Type': 'application/json',
  };
  let token;
  token = await cache.get(config.TOKENKEY).catch(() => {
    token = '';
  });
  if (token) {
    configs.headers.Authorization = token;
  }

  return configs;
}, (err) => {
  return Promise.reject(err);
});

// http response 拦截器（所有接收到的请求都要从这儿过一次）
axios.interceptors.response.use((response) => {
  switch (response.data.code) {
    case 0:
      return response.data;
    case 20103:
      navigation('Login');
      return Promise.reject('该账号在另一台设备上登陆,请重新登陆');
    default:
      return Promise.reject(response.data.message);
  }
}, (error) => {
  return Promise.reject(error);
});

/**
 * fetch 请求方法
 * @param url
 * @param params
 * @returns {Promise}
 */
export function get(url, params = {}) {
  return new Promise((resolve, reject) => {
    axios.get(url, {
      params,
    }).then((response) => {
      resolve(response.data);
    }).catch((err) => {
      reject(err);
    });
  });
}

/**
 * post 请求方法
 * @param url
 * @param data
 * @returns {Promise}
 */
export function post(url, data = {}) {
  return new Promise((resolve, reject) => {
    axios.post(url, data).then((response) => {
      resolve(response.data);
    }, (err) => {
      reject(err);
    });
  });
}

/**
 * patch 方法封装
 * @param url
 * @param data
 * @returns {Promise}
 */
export function patch(url, data = {}) {
  return new Promise((resolve, reject) => {
    axios.patch(url, data).then((response) => {
      resolve(response.data);
    }, (err) => {
      reject(err);
    });
  });
}

/**
 * put 方法封装
 * @param url
 * @param data
 * @returns {Promise}
 */
export function put(url, data = {}) {
  return new Promise((resolve, reject) => {
    axios.put(url, data).then((response) => {
      resolve(response.data);
    }, (err) => {
      reject(err);
    });
  });
}

/**
 * 登陆
 * @date   2019-7-10
 * @param  {Object}   data
 * @return {Promise}
 */
export function login(data = {}) {
  return post('/user/login', data);
}

/**
 * 获取任务列表
 * @date   2019-7-10
 * @param  {Object}   data
 * @return {Promise}
 */
export function getTasks(data = {}) {
  return get('/tasks', data);
}

/**
 * 获取任务详情
 * @date   2019-7-10
 * @param  {Object}   data
 * @return {Promise}
 */
export function getTaskDetails(data = {}) {
  return get('/task', data);
}

/**
 * 报名任务
 * @date   2019-7-10
 * @param  {Object}   data
 * @return {Promise}
 */
export function applyTask(data = {}) {
  return post('/user/applytask', data);
}

/**
 * 提交任务
 * @date   2019-7-10
 * @param  {Object}   data
 * @return {Promise}
 */
export function submitTask(data = {}) {
  return put('/user/submittask', data);
}

/**
 * 获取进行中任务列表
 * @date   2019-7-10
 * @param  {Object}   data
 * @return {Promise}
 */
export function getProcessTasks(data = {}) {
  return get('/user/tasks', data);
}

/**
 * 获取进行中任务列表
 * @date   2019-7-10
 * @param  {Object}   data
 * @return {Promise}
 */
export function getCheckDetails(data = {}) {
  return get('/applicant', data);
}

/**
 * 获取个人信息
 * @date   2019-7-12
 * @param  {Object}   data
 * @return {Promise}
 */
export function getUser(data = {}) {
  return get('/user', data);
}

/**
 * 绑定支付宝
 * @date   2019-7-12
 * @param  {Object}   data
 * @return {Promise}
 */
export function setAlipay(data = {}) {
  return put('/user/alipay', data);
}

/**
 * 获取支付宝
 * @date   2019-7-12
 * @param  {Object}   data
 * @return {Promise}
 */
export function getAlipay(data = {}) {
  return get('/user/alipay', data);
}

/**
 * 修改密码
 * @date   2019-7-12
 * @param  {Object}   data
 * @return {Promise}
 */
export function modifyPw(data = {}) {
  return put('/user/resetpwd', data);
}

/**
 * 获取余额
 * @date   2019-7-12
 * @param  {Object}   data
 * @return {Promise}
 */
export function getMoney(data = {}) {
  return get('/user/balance', data);
}

/**
 * 退出登陆
 * @date   2019-7-15
 * @param  {Object}   data
 * @return {Promise}
 */
export function loginOut(data = {}) {
  return post('/user/logout', data);
}

/**
 * 获取排名
 * @date   2019-7-17
 * @param  {Object}   data
 * @return {Promise}
 */
export function getRanks(data = {}) {
  return get('/ranking', data);
}

/**
 * 获取平台账号列表
 * @date   2019-7-18
 * @param  {Object}   data
 * @return {Promise}
 */
export function getAccounts(data = {}) {
  return get('/accounts', data);
}

/**
 * 添加平台账号
 * @date   2019-7-18
 * @param  {Object}   data
 * @return {Promise}
 */
export function addAccount(data = {}) {
  return post('/account', data);
}

/**
 * 修改接单状态
 * @date   2019-7-18
 * @param  {Object}   data
 * @return {Promise}
 */
export function modifyTaskStatus(data = {}) {
  return put('/user/taskstatus', data);
}

/**
 * 获取每月收益
 * @date   2019-7-25
 * @param  {Object}   data
 * @return {Promise}
 */
export function getIncome(data = {}) {
  return get('/user/income', data);
}

/**
 * 获取获奖规则
 * @date   2019-7-25
 * @param  {Object}   data
 * @return {Promise}
 */
export function getAwardSetting(data = {}) {
  return get('/common/awardsetting', data);
}

/**
 * 上传文件
 * @date   2019-7-10
 * @param  {Object}   data
 * @return {Promise}
 */
export async function uploadFile(data = {}) {
  const formData = new FormData();

  data.forEach(v => {
    formData.append('file', {
      uri: v.key,
      type: 'multipart/form-data',
      name: 'image.jpg',
    });
  });
  let token;
  token = await cache.get(config.TOKENKEY).catch(() => {
    token = '';
  });
  return fetch(`${config.BASEURL}/common/upload`, {
    method: "POST",
    headers: {
      'Content-Type': 'multipart/form-data',
      Authorization: token,
    },
    body: formData,
  });
}